/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cl.web.managedbeans;

import cl.bussines.ejbs.ClientesFacade;
import cl.bussines.ejbs.ComunasFacade;
import cl.bussines.entities.Clientes;
import cl.bussines.entities.Comunas;
import cl.web.jsf.util.Rut;
import cl.web.jsf.util.ValidateResult;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.apache.log4j.Logger;

/**
 *
 * @author Vogel
 */
@ManagedBean(name="clienteMBean")
@SessionScoped
public class ClienteMBean extends BaseMBean{

    private static final String VISTA_LISTAR = "clientes";
    private static final String VISTA_CREAR = "clientesCrear";
    private static final String VISTA_EDITAR = "clientesEditar";
    
    private List<Clientes> clientes;
    @EJB
    private cl.bussines.ejbs.ClientesFacade ejbFacade;
    @EJB
    private ComunasFacade comunasEjb;
    private static Logger LOG = Logger.getLogger(ClienteMBean.class);
    private Clientes cliente = new Clientes();  
    private List<Comunas> comunas;
    private boolean check = false;
    private String msgRut;
    private String selectedText;
    private boolean esVisible = false;
    private String msgComuna;
    
    public String init(){
        return VISTA_LISTAR;
    }
    
    public String edit(){
        try {
            String codigo = getParam("codigo");
            LOG.info("Codigo del edit:"+codigo);
            this.setEsVisible(true);
        } catch (Exception e) {
            LOG.error(e);
        }
        return VISTA_LISTAR;
    }
    
    public String delete(){
        try{
            int codigo = Integer.parseInt(getParam("codigo"));
            String index = getParam("index");

            LOG.info("Codigo del cliente a editar ["+codigo+"]");
            LOG.info("Index de la tabla ["+index+"]");
            LOG.info("clientes size ["+clientes.size()+"]");
            for(Clientes clie : clientes){ 
                if(clie.getIdClie()==codigo){
                    LOG.info("Entro a setear el cliente;");
                    this.cliente = clie;
                }
            }
            if(cliente != null && cliente.getIdClie()!=0){
                LOG.info("START::DELETE::");
                ejbFacade.remove(cliente);
                message(FacesMessage.SEVERITY_INFO,"Ha eliminado correctamente.");
            }
            
            clientes.clear();
        } catch (Exception e) {
            LOG.error(e);
            message(FacesMessage.SEVERITY_ERROR,"Error al eliminar cliente.");
        }
        return VISTA_LISTAR;
    }
    
    public String volver(){
        return init();
    }
    
    public String irCrear(){
        cliente = new Clientes();
        return VISTA_CREAR;
    }
    
    public String irEditar(){
        int codigo = Integer.parseInt(getParam("codigo"));
        String index = getParam("index");
        
        LOG.info("Codigo del cliente a editar ["+codigo+"]");
        LOG.info("Index de la tabla ["+index+"]");
        LOG.info("clientes size ["+clientes.size()+"]");
        for(Clientes clie : clientes){ 
            if(clie.getIdClie()==codigo){
                LOG.info("Entro a setear el cliente;");
                this.cliente = clie;
            }
        }
        setSelectedText(cliente.getCUTComuna().getNomComu());
        LOG.info(cliente);
        return VISTA_EDITAR;
    }
    
    public String crear(){
        this.msgRut = "";
        this.msgComuna = "";
        try {
            //CAMPOS OBLIGATORIOS
            LOG.info("RUT :"+cliente.getRutClie()+" dv :"+cliente.getDvClie());
            String rut = cliente.getRutClie().replace(".", "");
            cliente.setRutClie(rut);
            ValidateResult valResult = Rut.validateRUT(cliente.getRutClie()+"-"+cliente.getDvClie());
			if (valResult.getErrorResult() == null || "".equals(valResult.getErrorResult())){
				this.msgRut = "";
			}else{
                            this.msgRut = "El rut ingresado no es válido";
                        }
            LOG.info("Nombre: "+cliente.getNombresClie());
            LOG.info("Apellido: "+cliente.getApellidosClie());
            LOG.info("Comuna seleccionada: "+getSelectedText());
                if(getSelectedText()!=null || "".equals(getSelectedText())){
                    for(Comunas comu : comunas){
                        if(comu.getNomComu().equals(getSelectedText())){
                            LOG.info(comu.getNomComu()+" igual a "+getSelectedText());
                            cliente.setCUTComuna(comu);
                        }
                    }
                }
            LOG.info("Comuna: "+cliente.getCUTComuna());
            if(cliente.getCUTComuna()==null){
                msgComuna = "La comuna seleccionada no es válida.";
            }
            LOG.info("Telefono 1: "+cliente.getFono());
            LOG.info("Email :"+cliente.getEMail());
            if(cliente.getEMail() != null || !cliente.getEMail().equals("")){
                // @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation
            }
            LOG.info("Canal :"+cliente.getCanalComunicacion());
            if(cliente.getCanalComunicacion().equals("1")){
                cliente.setCanalComunicacion("TELEFONO");
            }else if(cliente.getCanalComunicacion().equals("2")){
                cliente.setCanalComunicacion("E-MAIL");
            }else{
                cliente.setCanalComunicacion("SIN PREFERENCIA");
            }
            LOG.info("adicional :"+check);
            
            //CAMPOS OPCIONALES
            if(check){
                LOG.info("Fono 2: "+cliente.getFono2());
                LOG.info("F. Nacimiento: "+cliente.getFechaNacimiento());
                
                LOG.info("Direccion: "+cliente.getDireccionClie());
                LOG.info("Sexo :"+cliente.getSexo());
                LOG.info("Estado civil: "+cliente.getEstadoCivil());
            }
            
            //SE CREA CLIENTE
            if(this.msgRut.equals("") && this.msgComuna.equals("")){
                LOG.info("START::CREATE::");
                ejbFacade.create(cliente);
                message(FacesMessage.SEVERITY_INFO,"Ha sido creado correctamente.");
            }
            
        } catch (Exception e) {
            LOG.error(e);
            message(FacesMessage.SEVERITY_ERROR,"Error al crear nuevo cliente.");
        }
        return VISTA_CREAR;
    }
    
    public String editar(){
        this.msgRut = "";
        this.msgComuna = "";
        try {
            //CAMPOS OBLIGATORIOS
            LOG.info("RUT :"+cliente.getRutClie()+" dv :"+cliente.getDvClie());
            String rut = cliente.getRutClie().replace(".", "");
            cliente.setRutClie(rut);
            ValidateResult valResult = Rut.validateRUT(cliente.getRutClie()+"-"+cliente.getDvClie());
			if (valResult.getErrorResult() == null || "".equals(valResult.getErrorResult())){
				this.msgRut = "";
			}else{
                            this.msgRut = "El rut ingresado no es válido";
                        }
            LOG.info("Nombre: "+cliente.getNombresClie());
            LOG.info("Apellido: "+cliente.getApellidosClie());
            LOG.info("Comuna seleccionada: "+getSelectedText());
                if(getSelectedText()!=null || "".equals(getSelectedText())){
                    for(Comunas comu : comunas){
                        if(comu.getNomComu().equals(getSelectedText())){
                            LOG.info(comu.getNomComu()+" igual a "+getSelectedText());
                            cliente.setCUTComuna(comu);
                        }
                    }
                }
            LOG.info("Comuna: "+cliente.getCUTComuna());
            if(cliente.getCUTComuna()==null){
                msgComuna = "La comuna seleccionada no es válida.";
            }
            LOG.info("Telefono 1: "+cliente.getFono());
            LOG.info("Email :"+cliente.getEMail());
            if(cliente.getEMail() != null || !cliente.getEMail().equals("")){
                // @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation
            }
            LOG.info("Canal :"+cliente.getCanalComunicacion());
            if(cliente.getCanalComunicacion().equals("1")){
                cliente.setCanalComunicacion("TELEFONO");
            }else if(cliente.getCanalComunicacion().equals("2")){
                cliente.setCanalComunicacion("E-MAIL");
            }else{
                cliente.setCanalComunicacion("SIN PREFERENCIA");
            }
            LOG.info("adicional :"+check);
            
            //CAMPOS OPCIONALES
            if(check){
                LOG.info("Fono 2: "+cliente.getFono2());
                LOG.info("F. Nacimiento: "+cliente.getFechaNacimiento());
                
                LOG.info("Direccion: "+cliente.getDireccionClie());
                LOG.info("Sexo :"+cliente.getSexo());
                LOG.info("Estado civil: "+cliente.getEstadoCivil());
            }
            
            //SE CREA CLIENTE
            if(this.msgRut.equals("") && this.msgComuna.equals("")){
                LOG.info("START::EDITAR::");
                ejbFacade.edit(cliente);
                message(FacesMessage.SEVERITY_INFO,"Cliente editado correctamente.");
            }
            
        } catch (Exception e) {
            LOG.error(e);
            message(FacesMessage.SEVERITY_ERROR,"Error al editar nuevo cliente.");
        }
        return VISTA_EDITAR;
    }
    
    public Comunas getComunaAutocompletar(String text){
        Comunas comuna = new Comunas();
        for(Comunas com : getComunas()){
            if(com.getNomComu().equalsIgnoreCase(text)){
                comuna = com;
            }
        }
        return comuna;
    }
    
    public List<Clientes> getClientes() {
        if(clientes == null || clientes.isEmpty()){
            clientes = getEjbFacade().findAll();
        }
        return clientes;
    }

    public void setClientes(List<Clientes> clientes) {
        this.clientes = clientes;
    }

    public ClientesFacade getEjbFacade() {
        return ejbFacade;
    }

    public void setEjbFacade(ClientesFacade ejbFacade) {
        this.ejbFacade = ejbFacade;
    }

    public Clientes getCliente() {
        return cliente;
    }

    public void setCliente(Clientes cliente) {
        this.cliente = cliente;
    }

    public boolean isCheck() {
        return check;
    }

    public void setCheck(boolean check) {
        this.check = check;
    }

    public String getMsgRut() {
        return msgRut;
    }

    public void setMsgRut(String msgRut) {
        this.msgRut = msgRut;
    }

    public List<Comunas> getComunas() {
        if(comunas == null || comunas.isEmpty()){
            comunas = getComunasEjb().findAll();
        }    
        return comunas;
    }

    public void setComunas(List<Comunas> comunas) {
        this.comunas = comunas;
    }

    public ComunasFacade getComunasEjb() {
        return comunasEjb;
    }

    public void setComunasEjb(ComunasFacade comunasEjb) {
        this.comunasEjb = comunasEjb;
    }

    public String getSelectedText() {
        return selectedText;
    }

    public void setSelectedText(String selectedText) {
        this.selectedText = selectedText;
    }

    public boolean isEsVisible() {
        return esVisible;
    }

    public void setEsVisible(boolean esVisible) {
        this.esVisible = esVisible;
    }

    public String getMsgComuna() {
        return msgComuna;
    }

    public void setMsgComuna(String msgComuna) {
        this.msgComuna = msgComuna;
    }
    
    
}
